/**  
 * All rights Reserved, Designed By <a href="www.itttq.com" target="_blank">www.itttq.com</a>
 * @date:   2017-07-21 11:42:21
 * @Copyright: 2017 <a href="www.itttq.com" target="_blank">www.itttq.com</a> Inc. All rights reserved. 
 */
package com.itttq.gshop.pbpm.controller;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.itttq.gshop.domain.po.OrderInfoPo;
import com.itttq.gshop.domain.to.IndexStatTo;
import com.itttq.gshop.domain.to.OrderTo;
import com.itttq.gshop.domain.to.ResultPageTo;
import com.itttq.gshop.domain.to.ResultTo;
import com.itttq.gshop.generic.controller.GenericController;
import com.itttq.gshop.pbpm.service.OrderInfoService;

@RestController
@RequestMapping("orderInfo")
public class OrderInfoController extends GenericController {
	private static final long serialVersionUID = -6746968155372121L;
	public static final String CACHE_KEY = "orderInfo";
	@Autowired
	private OrderInfoService orderInfoService;
	
	/**
	 * 根据条件获取OrderInfoPo对象，并返回查询的数据总数
	 * 
	 * @param orderInfo
	 * @Author 迷蝶
	 * @return ResultPageTo<OrderInfoPo>
	 */
	@RequestMapping("list")
	public ResultPageTo<OrderInfoPo> getOrderInfos(@RequestBody OrderInfoPo orderInfo) {
		return orderInfoService.getOrderInfos(orderInfo);
	}
	
	/**
	 * 根据条件获取OrderInfoPo对象，并返回查询的数据总数
	 * 
	 * @param orderInfo
	 * @Author 迷蝶
	 * @return List<OrderTo>
	 */
	@RequestMapping("orderWares")
    public List<OrderTo> getOrderWares(@RequestBody OrderInfoPo orderInfo) {
        return orderInfoService.getOrderWares(orderInfo);
    }
	
	/**
	 * 根据ID获取OrderInfoPo对象，并放入redis缓存
	 * 
	 * @param id	只能是数字
	 * @Author 迷蝶
	 * @return OrderInfoPo
	 */
	@RequestMapping("{id:^[0-9]*$}")
	@Cacheable(value=CACHE_KEY, key="'orderInfo_'+#id")
	public OrderInfoPo getOrderInfo(@PathVariable("id") int id) {
		return orderInfoService.getOrderInfo(id);
	}
	
	/**
	 * 保存OrderInfoPo对象，并清除此ID的缓存。<br>
	 * 如果ID存在，则更新对象；ID不存在则插入对象。
	 * 
	 * @param orderInfo
	 * @Author 迷蝶
	 * @return OrderInfoPo
	 */
	@RequestMapping("save")
	@CacheEvict(value=CACHE_KEY, key="'orderInfo_'+#orderInfo.id")
	public Integer saveOrderInfo(@RequestBody OrderInfoPo orderInfo) {
		int rs = 0;
		if(null == orderInfo) {return rs;}
		if(null == orderInfo.getId()) {
			rs = orderInfoService.addOrderInfo(orderInfo);
		} else {
			rs = orderInfoService.updateOrderInfo(orderInfo);
		}
		return rs;
	}
	
	/**
	 * 根据ID删除OrderInfoPo对象，并清除此ID的缓存。<br>
	 * 
	 * @param id	只能是数字
	 * @Author 迷蝶
	 * @return OrderInfoPo
	 */
	@RequestMapping("del/{id:^[0-9]*$}")
	@CacheEvict(value=CACHE_KEY, key="'orderInfo_'+#id")
	public Integer delOrderInfo(@PathVariable("id") int id) {
		return orderInfoService.delOrderInfo(id);
	}
	
	/**
	 * 根据订单ID更新订单状态，并记录到订单操作记录。<br>
	 * 订单变化限制如下：前面的状态必须由后面的状态变化而来
	 * 待支付1：无<br>
	 * 待发货2：<--待支付1；<br>
	 * 待收货3：<--待发货2；<br>
	 * 已完成4：<--待收货3；<br>
	 * 已取消5：<--待支付1；<br>
	 * 申请退款7：<--待发货2、退货中12；<br>
	 * 退款中8：<--申请退款7；<br>
	 * 已退款9：<--退款中8；<br>
	 * 退款失败10：<--申请退款7；<br>
	 * 申请退货11：<--待收货3；<br>
	 * 退货中12：<--申请退货11；<br>
	 * 退货失败15：<--申请退货11；<br>
	 * 删除16：<--已完成4、已取消5、已退款9、退款失败10、退货失败15<br>
	 * 取消退款：<--申请退款7<br>
	 * 取消退货：<--申请退货11
	 * 
	 * @param id	订单ID
	 * @param status	订单更新后的状态
	 * @param op	操作类型
	 * @param remark	备注
	 * @param operatorId	操作人ID，系统则为0
	 * @param operatorName	操作人名称，系统操作则为：系统
	 * @param uid	下单人ID，传此参数是避免到时候查询一次
	 * @Author 迷蝶
	 * @return ResultTo
	 */
	@RequestMapping("status/{id:^[0-9]*$}")
	@CacheEvict(value=CACHE_KEY, key="'orderInfo_'+#id")
	public ResultTo updateOrderStatus(@PathVariable("id") Integer id, String status, String op, 
			String remark, int operatorId, String operatorName) {
		return orderInfoService.updateOrderStatus(id, status, op, remark, operatorId, operatorName);
	}
	
	/**
	 * 获取订单全部和当天的统计数据
	 * 
	 * @Author 迷蝶
	 * @return IndexStatTo
	 *//**
	 * 获取今天新增用户
	 * 
	 * @Author 迷蝶
	 * @return IndexStatTo
	 */
	@RequestMapping("getOrderStat")
	public IndexStatTo getOrderStat() {
		return orderInfoService.getOrderStat();
	}
	/**
	 * 获取订单全部和当天的统计数据 TODO GXG 事务
	 * 
	 * @param order	订单对象
	 * @return
	 * @Author 迷蝶
	 * @return ResultTo
	 * @throws Exception 
	 */
	@RequestMapping("create")
	public ResultTo createOrder(@RequestBody OrderInfoPo order) throws Exception {
		return orderInfoService.createOrder(order);
	}
	
	/**
	 * 获取订单以及订单商品数据，因为用户搜索可能有其他条件，所以这里传对象
	 * 
	 * @param order
	 * @Author 迷蝶
	 * @return List<OrderTo>
	 */
	@RequestMapping("orders")
	public ResultPageTo<OrderTo> getOrders(@RequestBody OrderInfoPo order) {
		return orderInfoService.getOrders(order);
	}
	
	/**
	 * 批量更新订单状态，按订单时间是否大于指定时间来取消
	 * 
	 * @param status				更新后的订单状态
	 * @param statusCurrent	当前订单状态，更新前，此状态为限制订单状态只能有指定状态更新到下一状态。
	 * @param endTime			指定时间，当下单时间大于此时间的订单才更新
	 * @return
	 * @Author 迷蝶
	 * @return Integer
	 */
	@RequestMapping("updataStatusByTime")
	public Integer updateOrderStatusByTime(int status, int statusCurrent,  Date endTime) {
		return orderInfoService.updateOrderStatusByTime(status, statusCurrent, endTime);
	}
}